home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
176-200
/
191
/
filebootblock
/
filebootblock.asm
< prev
next >
Wrap
Assembly Source File
|
1995-03-13
|
10KB
|
315 lines
** Heres a little utility that I have just made.
** I thought what I wanted was on a fish disk but that program
** only saved dumps of boot blocks into files that disassemblers can
** read. So I decided to write one myself. Here it is
** The command to use on this is
** FileBootBlock df?: filename
** there must be only one space between the drive specifier of your
** filename will end up starting with spaces
** It will read the blocks 0 and 1 of the drive given and save it as
** a program file that can be run (heaven forbid) or disassembled
** by programs like DIS and DSM
** The only modifying it does is the the first 2 bytes of the block.
** As all program file must start with a valid instruction I have
** changed the first 2 bytes from 'DO' to $600A. This makes it into the
** instruction BRA.S *+$C which will get to the start of the proper code
** Have fun
** John Veldthuis
** 21 Ngatai Street
** Manaia, Taranaki
** New Zealand
** 22 November 1988
** Placed into the Public domain on this date
include "exec/types.i"
include "intuition/intuition.i"
include "devices/trackdisk.i"
include "exec/memory.i"
include "libraries/dosextens.i"
xref _LVOOpenLibrary
xref _LVOCloseLibrary
xref _LVODoIO
xref _LVOOpenDevice
xref _LVOCloseDevice
xref _LVOAllocEntry
xref _LVOFreeEntry
xref _LVOOpen
xref _LVOClose
xref _LVOWrite
xref _LVOAllocSignal
xref _LVOFreeSignal
Offsets macro
\1 equ soffset
soffset set soffset+\2
endm
soffset set 0
Offsets dosbase,4
Offsets execbase,4
Offsets filehandle,4
Offsets buffer,4
Offsets port,4
Offsets filename,4
Offsets diskreq,4
Offsets task,4
Offsets mementry,4
Offsets unit,4
Offsets stdout,4
Start:
lea BASE(pc),a5
move.l 4,a6
move.l a6,execbase(a5)
movem.l d0/a0,-(sp)
move.l $114(a6),a0 ;find our task
move.l a0,task(a5)
move.l pr_COS(a0),stdout(a5) ;save output stream for messages
moveq.l #33,d0 ;version 33 or greater
lea DosLib(pc),a1
jsr _LVOOpenLibrary(a6) ;open dos.library
movem.l (sp)+,d1/a0
tst.l d0
bne.s Lib1
NoLib move.l #20,d0 ;no library, indicate error and stop
rts
Lib1 move.l d0,dosbase(a5)
moveq #0,d0
move.b d0,-1(a0,d1.w) ;zero end of Command line
1$ move.b (a0)+,d0
beq CLIErr
and.b #%11011111,d0 ;change to uppercase
cmp.b #'D',d0 ;look for the D in DF?:
bne.s 1$
move.b (a0)+,d0 ;dummy read to skip the F
move.b (a0)+,d0 ;get unit number
sub.b #'0',d0 ;make into a real number
ext.w d0 ;sign extend to a word
ext.l d0 ;sign extend to a long
move.l d0,unit(a5) ;save unit number
2$ move.b (a0)+,d0 ;search for space
cmp.b #' ',d0
bne.s 2$
move.l a0,filename(a5) ;save address of filename
lea Mem(pc),a0
jsr _LVOAllocEntry(a6) ;allocate all memory in one go
btst #31,d0
bne MemErr ;if bit 31 set then error getting mem
move.l d0,mementry(a5) ;save for release
move.l d0,a0
add.w #Mem1-Mem,a0
move.l (a0),buffer(a5) ;save address of read/write buffer
bsr CreatePort ;create a reply port
tst.l d0
beq PError ;no message port
move.l d0,d3
move.l d0,port(a5) ;save for closing later
move.l mementry(a5),a0
add.w #Mem2-Mem,a0
move.l (a0),a0 ;make an IORequest block
move.b #NT_MESSAGE,LN_TYPE(a0)
move.w #IOSTD_SIZE,MN_LENGTH(a0)
move.l d3,MN_REPLYPORT(a0)
move.l a0,diskreq(a5) ;save IO block address
move.l unit(a5),d0
lea TrackName(pc),a0
move.l diskreq(a5),a1
moveq.l #0,d1
jsr _LVOOpenDevice(a6) ;open trackdisk on unit
tst.l d0
bgt TErr ;won't open, display error
move.l diskreq(a5),a1
move.w #CMD_READ,IO_COMMAND(a1)
move.l buffer(a5),IO_DATA(a1)
move.l #1024,IO_LENGTH(a1)
move.l #0,IO_OFFSET(a1)
jsr _LVODoIO(a6) ;read boot block into buffer
move.l diskreq(a5),a1
move.w #TD_MOTOR,IO_COMMAND(a1)
move.l #0,IO_LENGTH(a1)
jsr _LVODoIO(a6) ;turn motor off
move.l diskreq(a5),a1
move.b IO_ERROR(a1),d3 ;see what error there was
jsr _LVOCloseDevice(a6) ;close trackdisk down
cmp.b #19,d3
bgt ReadErr ;if an error display error
move.l buffer(a5),a0
move.w #$600A,(a0) ;change first to bytes to BRA.S *+$C
;so as not to upset relative addresses
move.l dosbase(a5),a6 ;get dosbase
move.l filename(a5),d1
move.l #MODE_NEWFILE,d2
jsr _LVOOpen(a6) ;open file that bootblock goes in
tst.l d0
beq OpenErr ;didn't open for some reason
move.l d0,filehandle(a5) ;save for closing
lea table(pc),a0 ;get first part of file
move.l a0,d2 ;used to create a program file
move.l d0,d1 ;filehandle into d1
moveq #32,d3 ;length of numbers
jsr _LVOWrite(a6)
cmp.l #32,d0
bne WriteErr
move.l buffer(a5),d2
move.l filehandle(a5),d1
move.l #1024,d3
jsr _LVOWrite(a6) ;write out rest of block to file
cmp.l #1024,d0 ;see if it all got written out
bne WriteErr
move.l filehandle(a5),d1
lea hunkend(pc),a0
move.l a0,d2
moveq #4,d3
jsr _LVOWrite(a6) ;write last bit of file
cmp.l #4,d0
bne.s WriteErr
Fin move.l filehandle(a5),d1
tst.l d1
beq.s 1$
jsr _LVOClose(a6) ;close file if it opened
1$ move.l execbase(a5),a6
move.l port(a5),d0
tst.l d0
beq.s 2$
move.l d0,a1
bsr DeletePort ;delete port if one got made
2$ move.l mementry(a5),d0
tst.l d0
beq.s 3$
move.l d0,a0
jsr _LVOFreeEntry(a6) ;freememory if any got allocated
3$ move.l dosbase(a5),a1
jsr _LVOCloseLibrary(a6) ;close dos.library
rts
MemErr:
lea MemMess(pc),a0
move.l a0,d2
moveq #47,d3
bra.s Err
Error:
CLIErr:
lea CLIMess(pc),a0
move.l a0,d2
moveq #36,d3
bra.s Err
ReadErr:
lea ReadMess(pc),a0
move.l a0,d2
moveq #36,d3
bra.s Err
WriteErr:
lea WriteMess(pc),a0
move.l a0,d2
moveq #28,d3
bra.s Err
OpenErr:
lea OpenMess(pc),a0
move.l a0,d2
moveq #25,d3
bra.s Err
PError:
lea PMess(pc),a0
move.l a0,d2
moveq #41,d3
bra.s Err
TErr
lea TMess(pc),a0
move.l a0,d2
moveq #39,d3
Err move.l stdout(a5),d1
tst.l d1
beq Fin ;if no output stream
move.l dosbase(a5),a6
jsr _LVOWrite(a6)
bra Fin
CreatePort:
move.l a2,-(a7)
move.l mementry(a5),a2
add.w #Mem3-Mem,a2
move.l (a2),a2
moveq #-1,d0
jsr _LVOAllocSignal(a6)
moveq #-1,d1
cmp.l d0,d1 ;-1 indicates bad signal
bne.s cp_sigok
move.l (a7)+,a2
moveq #0,d0 ;otherwise indicate no port
rts
cp_sigok:
move.b d0,MP_SIGBIT(a2)
move.b #PA_SIGNAL,MP_FLAGS(a2)
move.b #NT_MSGPORT,LN_TYPE(a2)
clr.b LN_PRI(a2)
move.l task(a5),d0
move.l d0,MP_SIGTASK(a2)
lea.l MP_MSGLIST(a2),a0 ;Point to list header
NEWLIST a0 ;Init new list macro
move.l a2,d0
move.l (a7)+,a2 ;cc's NOT affected
rts
DeletePort:
moveq #-1,d0
move.b d0,LN_TYPE(a1)
move.l d0,MP_MSGLIST+LH_HEAD(a1)
moveq #0,d0
move.b MP_SIGBIT(a1),d0
jsr _LVOFreeSignal(a6)
rts
table:
dc.l $3f3 ;Hunk_Header
dc.l 0 ;no Hunk_Name
dc.l 1 ;size of hunk table
dc.l 0 ;first hunk
dc.l 0 ;last hunk
dc.l 256 ;number of longwords in hunk
dc.l $3e9 ;Hunk_Code
dc.l 256 ;number of longwords in hunk
hunkend
dc.l $3f2 ;hunk end
BASE:
Dosbase dc.l 0
Execbase dc.l 0
Filehandle dc.l 0
Buffer dc.l 0
Port dc.l 0
FileName dc.l 0
DiskReq dc.l 0
Task dc.l 0
MemEntry dc.l 0
Unit dc.l 0
Stdout dc.l 0
Mem ds.b LN_SIZE
dc.w 3
Mem1 dc.l MEMF_CHIP!MEMF_CLEAR
dc.l 1024
Mem2 dc.l MEMF_PUBLIC!MEMF_CLEAR
dc.l IOSTD_SIZE
Mem3 dc.l MEMF_PUBLIC!MEMF_CLEAR
dc.l MP_SIZE
DosLib dc.b 'dos.library',0
TrackName dc.b 'trackdisk.device',0
MemMess dc.b 'Not enough Memory to allocate required buffers',10
CLIMess dc.b 'Usage: FileBootBlock df?: filename',10
ReadMess dc.b 'Disk Error while reading Boot Block',10
WriteMess dc.b 'Error while writing to file',10
OpenMess dc.b 'Error while opening file',10
PMess dc.b 'Couldn''t create message port for disk IO',10
TMess dc.b 'Couldn''t get access to specified drive',10
end